/*
 * The copyright of these materials are subject to the
 * original authors.
 * 
 * This code is distributed freely.
 */
package org.nebulaframework.benchmark.scimark2;

public class Jacobi {
	public static final double num_flops(int M, int N, int num_iterations) {
		double Md = (double) M;
		double Nd = (double) N;
		double num_iterD = (double) num_iterations;

		return (Md - 1) * (Nd - 1) * num_iterD * 6.0;
	}

	public static final void SOR(double omega, double G[][], int num_iterations) {
		int M = G.length;
		int N = G[0].length;

		double omega_over_four = omega * 0.25;
		double one_minus_omega = 1.0 - omega;

		// update interior points
		//
		int Mm1 = M - 1;
		int Nm1 = N - 1;
		for (int p = 0; p < num_iterations; p++) {
			for (int i = 1; i < Mm1; i++) {
				double[] Gi = G[i];
				double[] Gim1 = G[i - 1];
				double[] Gip1 = G[i + 1];
				for (int j = 1; j < Nm1; j++)
					Gi[j] = omega_over_four
							* (Gim1[j] + Gip1[j] + Gi[j - 1] + Gi[j + 1])
							+ one_minus_omega * Gi[j];
			}
		}
	}
}
